#include <stdlib.h>
#include <gtk/gtk.h>

gint totallwindows=0;

void dialog_and_exit(gchar *txt) {
	GtkWidget *dialog;
	g_debug("dialog_and_exit\n");
	dialog=gtk_message_dialog_new(NULL,0,GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,txt,NULL);
	gtk_dialog_run(GTK_DIALOG(dialog));
	exit(1);
}
gboolean
any_window_delete_cb(GtkWidget *widget,GdkEvent *ev,gpointer data) {
	g_debug("any_window_delete_cb %d\n",totallwindows);
	totallwindows--;
	if (!totallwindows) {
		gtk_main_quit();	
	}
	return FALSE;
}
/** отобразить виджет построенный GTK_BUILDER`ом
	если виджет не является окном, то окно для него надо сделать
*/
void
display_builded_widget(GtkBuilder *builder,GtkWidget *widget) {
	GtkWidget *window;
	gtk_builder_connect_signals(builder,widget);
	if (GTK_IS_WINDOW(widget)) {
		window=widget;
	} else {
		window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
		if (gtk_widget_get_ancestor(widget,GTK_TYPE_CONTAINER))
			gtk_widget_reparent(widget,window);
		else
			gtk_container_add(GTK_CONTAINER(window),widget);
	}
	g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(any_window_delete_cb),widget);
	gtk_widget_show_all(window);
	totallwindows++;
}
int main(int argc,char *argv[]) {
	GtkWidget *window;
	GtkBuilder *builder;
	GError *error;
	gint ret;
	
	gtk_init(&argc,&argv);
	
	if (argc==1) {		/* если аргументы не переданы - ругнуться и выйти */
		dialog_and_exit("cmdline: gladeplay <gladefile> {<widget_id> ...}");
	}
	builder=gtk_builder_new();
	error=NULL;
	ret=gtk_builder_add_from_file(builder,argv[1],&error);
	if (!ret) {
		dialog_and_exit("failed: gtk_builder_add_from_file");
	}
	if (argc==2) { 	/* если переданно только имя файла - отобразить все виджеты унаследованные от GTK_WINDOW */
		GSList *list;
		for(list=gtk_builder_get_objects(builder);list;list=g_slist_next(list)) {
			GObject *obj;
			obj=G_OBJECT(list->data);
			if (GTK_IS_WINDOW(obj)) {
				display_builded_widget(builder,GTK_WIDGET(obj));
			}
		}
	} else {			/* если заданны имена виджетов - то отображаем их */
		int t;
		for(t=2;t<argc;t++) {
			GtkWidget *widget;
			widget=GTK_WIDGET(gtk_builder_get_object(builder,argv[t]));
			if (widget!=NULL) {
				display_builded_widget(builder,widget);
			}
		}
	}
	
	if (totallwindows) 
		gtk_main();

	return 0;
}

